Skip to content

Cyclone DDS 代理模型:发现协议与状态镜像 ​

DDS 的发布订阅建立在「发现」之上:通信双方先互相知道对方的存在和端点,再谈数据收发。但发现本身是异步的,网络延迟、丢包、多播时序都会让两边进入「一方已发现另一方、反向还没完成」的中间态。本文介绍 Eclipse Cyclone DDS 用代理(Proxy)机制管理这种不确定性的方式:本地只为已确认的远程实体建立镜像,所有匹配、收发与资源回收都围绕镜像进行。适合在选型或排查 DDS 通信问题时想理解其内部模型的读者。

发现协议与不对称问题 ​

DDSI/RTPS 的发现分两层协议:

  • SPDP(Simple Participant Discovery Protocol):发现远程参与者(Participant)。
  • SEDP(Simple Endpoint Discovery Protocol):发现远程端点(Writer/Reader)。

两层各自独立、异步进行,于是很容易出现不对称发现(Asymmetric Discovery)——一方完成了对另一方的发现,反向还没有完成:

如果实现不对这个中间态做约束,会带来两类问题:

  • 数据交付风险:数据可能发给未经完整匹配验证的端点,带宽浪费之外,接收方也无法确认来源经过了 QoS 校验。
  • 通信阻塞风险:读取者认为写入者存在并等待数据,写入者认为读取者不存在而从不发送,应用层的等待可能无限期挂起。

代理模型:本地状态镜像 ​

Cyclone DDS 的做法是给每一个发现的远程实体在本地内存建一个代理对象,作为该实体的本地镜像,参与所有后续的匹配计算、状态管理与传输控制:

  • Proxy Participant:远程参与者的镜像。
  • Proxy Writer / Proxy Reader:远程端点的镜像。

通信由此被两条硬性规则约束:

  1. 本地 Writer 只向已建立 Proxy Reader 的远程端点发送数据。
  2. 本地 Reader 只接收来自已建立 Proxy Writer 的远程端点的数据。

只有双向发现都完成(双方都建立了对方实体的代理)并且匹配检查通过,数据通道才真正激活。「看得见」与「能通信」是两个不同的门槛,代理模型把两者拆开了。

匹配流程 ​

代理的创建遵循严格的层级逻辑:

  1. 参与者发现:收到远程节点的 SPDP 消息,创建 Proxy Participant,并启动租约计时。
  2. 端点发现:收到 SEDP 消息,在对应 Proxy Participant 下创建 Proxy Writer 或 Proxy Reader。
  3. 匹配检查:检查本地端点与代理是否满足匹配条件——主题名称、类型名称、QoS 设置三者都要一致。匹配失败的代理只是存在,不产生通信。

以「B 发现了 A 的 Writer、A 还没发现 B 的 Reader」为例,时序上依次是:

Writer 在代理缺失时主动抑制发送,从机制上消除了「一端等待、另一端沉默」的死锁窗口。

多播例外 ​

单播路径执行上述白名单机制。多播是官方明确允许的例外:Writer 可以选择把数据发到多播组,此时读取者即使已经发现写入者、而写入者尚未发现自己,也能收到数据——这是代理模型下被认可的单侧接收路径。代价是不享受可靠性的完整保障(如重传配合),多播定位是可选的优化手段,不改变连接状态管理的核心逻辑。

生命周期:租约与级联清理 ​

代理采用层级化管理:代理端点归属于代理参与者,资源回收由此有两个层次:

text
Proxy Participant(根)
├── Proxy Writer 1
├── Proxy Writer 2
└── Proxy Reader 1
触发事件 行为 影响范围
SEDP Dispose/Unregister 删除特定代理端点 仅该 Proxy Writer/Reader
租约超时(Lease Duration) 判定远程参与者失联 级联删除 Proxy Participant 及其全部子端点
参与者显式下线 立即清理,不等超时 相关代理资源全部回收

租约时长由参与者在 SPDP 消息中声明,远程节点周期性发送 SPDP 续租;超时未续即触发级联清理,防止失联节点的代理在内存里无限累积。

与无代理实现的对比 ​

维度 无代理/弱状态实现 Cyclone DDS 代理模型
连接建立条件 单侧发现即可尝试通信 双侧代理建立后方可通信
数据来源校验 可能接收未验证来源的数据 仅处理来自已知代理的数据
阻塞风险 半连接状态易无限等待 代理缺失时抑制收发,避免死锁
资源回收 依赖全局超时,清理滞后 层级级联删除 + 租约机制
匹配严谨性 存在误匹配空间 Topic + Type + QoS 三重校验

总结 ​

Cyclone DDS 的代理模型,本质是把分布式的异步发现过程收敛为本地确定性的状态机:远程实体先以代理形式落地,再经过三重匹配升级为可通信的连接,最后由租约与级联删除管理退场。对使用者来说,这个模型解释了两类常见现象——为什么短暂的网络分区恢复后通信能自动续上(租约内代理仍在),以及为什么端点创建后数据不会立即流动(要等双向发现与匹配完成)。

内容整理自官方文档 Discovery behaviour — Eclipse Cyclone DDS 11.0.0。

最近更新

基于 VitePress 构建